package com.ux.validators
{
	
	public class ResidentNumberValidator
	{
		
		public function ResidentNumberValidator( )
		{
		}
		
		
		
		
		/**
		 * 주민번호 체크
		 * ---> '-' 으로 연결되어 넘어오거나, '-'없이 넘어오는 경우 모두 가능
		 * @param str
		 * @return 
		 */		
		public static function validateJuminNumber( str:String ) : Boolean
		{
			if( str == null ) return false;
			
			var jumin:String = "";
			
			// 주민번호가 숫자만 13자리로 넘어올 경우
			var pattern:RegExp = /[0-9]{13}/;
			if( str.length == 13 && pattern.exec( str ) ) {
				jumin = str;
			}
			// 주민번호가 '-' 으로 연결되어 매개변수로 넘어올 경우
			else if( str.indexOf( "-" ) != -1 && str.length == 14 ) {
				var pattern0:RegExp = /[0-9]{6}/;
				var pattern1:RegExp = /[0-9]{7}/;
				var str0:String = str.substr( 0, str.indexOf( "-" ) );
				var str1:String = str.substr( str.indexOf( "-" ) + 1 );
				
				if( pattern0.exec( str0 ) && pattern1.exec( str1 ) )
					jumin = str0 + str1;
				else
					return false;
			}
			
			var total:int = 0;
			var temp:Array = [ ];
			for( var i:int=0 ; i<13 ; i++ ) temp[ i ] = int( jumin.charAt( i ) ); // 각 자리번호를 정수로 변환하여 배열에 저장
			
			// 각 자리번호에 2,3,4 ... 를 곱하여 결과를 더하여 누적
			for( i=0 ; i<12 ; i++ ) {				
				var k:int = i + 2;
				if( k > 9 ) k = ( k % 10 ) + 2;
				total += temp[ i ] * k;
			}
			
			var r:int = 11 - ( total % 11 );
			if( r == 10 ) r = 0;
			if( r == 11 ) r = 1;
			
			if( r == temp[ 12 ] )
				return true; // 정확한 주민번호
			else
				return false; // 틀린 주민번호
		}
		
		
		
		/**
		 * 외국인 등록번호 유효성 체크.
		 * <br>
		 * 
		 * 주민등록번호와는 자릿수는 같지만 생성체계가 약간 틀리다.
		 */
		public static function validateForeignNumber( value:String ) : Boolean
		{
			value = value.split( "-" ).join( "" );
			
			var len:int = 13;
			var buf:Array = new Array( len );
			for( var i:int=0 ; i<len ; ++i ) {
				buf[ i ] = Number( value.charAt( i ) );
			}
			
			var odd:int = ( buf[ 7 ] * 10 ) + buf[ 8 ];
			if( odd % 2 != 0 ) {
				return false;
			}
			
			if( ( buf[ 11 ] != 6 ) && ( buf[ 11 ] != 7 ) && ( buf[ 11 ] != 8 ) && ( buf[ 11 ] != 9 ) ) {
				return false;
			}
			
			var sum:int = 0;
			var multiple:Array = [ 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5 ];
			for( i=0 ; i<12 ; i++ ) {
				sum += ( buf[ i ] *= multiple[ i ] );
			}
			sum = 11 - ( sum % 11 );
			
			if( sum >= 10 ) {
				sum -= 10;
			}
			sum += 2;
			
			if( sum >= 10 ) {
				sum -= 10;
			}
			
			if( sum != buf[ 12 ] ) {
				return false;
			}
			
			return true;
		} 
		
		
		
		
		
		/**
		 * 사업자번호 유효성 체크
		 */		
		public static function validateBizNumber( value:String ) : Boolean
		{
			value = value.split( "-" ).join( "" );
			
	        var getlist:Array = new Array( 10 );
	        var chkvalue:Array = [ 1, 3, 7, 1, 3, 7, 1, 3, 5 ]; //[ "1", "3", "7", "1", "3", "7", "1", "3", "5" ];
	        
	        var i:int , len:int;
	        
	        len = getlist.length;
	        for( i=0 ; i<len ; i++ ) {
	        	getlist[ i ] = Number( value.substring( i, i + 1 ) );
	        }
	        
	        var sum:Number = 0;
	        len = chkvalue.length;
	        for( i=0 ; i<len ; i++ ) {
	        	sum += getlist[ i ] * chkvalue[ i ];
	        }
	        
	        sum = sum + int( ( getlist[ 8 ] * 5 ) / 10 );
	        
	        var sidliy:int = sum % 10;
	        var sidchk:int = 0;
	        if( sidliy != 0 ) {
	        	sidchk = 10 - sidliy;
	        }
	        else {
	        	sidchk = 0;
	        }
	        
	        if( sidchk != getlist[ 9 ] ) {
	        	return false;
	        }
	        return true;
		}
		
	}
}